package com.regan.erp.util;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.jfinal.kit.StrKit;
import com.regan.erp.model.Dict;

import java.util.Collections;
import java.util.List;

/**
 * 字典工具类
 * @author zhangby
 * @date 2018/10/23 下午3:17
 */
public class DictUtil {

    /** 字典类型 */
    private static final String DICT_TYPE = "dict_type";

    /**
     * 根据字典类型，获取字典列表
     * @param type 父类val
     * @return
     */
    public static List<Dict> getDictList4Type(String type) {
        if (StrKit.isBlank(type)) {
            return Collections.EMPTY_LIST;
        }
        //获取redis
        String redisKey = StrUtil.format(ConfigUtil.redisKey().get(DICT_TYPE), type);
        List<Dict> redisVal = RedisUtil.getArray(redisKey, Dict.class);
        //判断数据是否为空
        if (ObjectUtil.isNull(redisVal)) {
            //查询数据
            Dict parentDict = Dict.dao.findFirst("select * from t_dict where value=?", type);
            redisVal = Dict.dao.find("select * from t_dict where parent_id=?", parentDict.getId());
            //加入redis
            if (!redisVal.isEmpty()) {
                RedisUtil.set(redisKey,redisVal);
            }
        }
        return redisVal;
    }

    /**
     * 根据父类类型，和字典值获取标签名
     * @param type 父类val
     * @param val 子类值
     * @param defaultVal 默认值
     * @return
     */
    public static String getDictLabel(String type,String val,String defaultVal) {
        List<Dict> dictList4Type = getDictList4Type(type);
        if (dictList4Type.isEmpty()) {
            return null;
        }
        //获取数据
        Dict dict = dictList4Type.stream().filter(d -> ObjectUtil.equal(val, d.getValue())).findFirst().get();
        return ObjectUtil.isNotNull(dict)?dict.getLabel():defaultVal;
    }

    /**
     * 根据父类类型，和字典值获取标签名
     * @param type 父类val
     * @param val 子类值
     * @return
     */
    public static String getDictLabel(String type,String val){
        return getDictLabel(type, val, null);
    }

    /**
     * 根据父类类型，和字典标签获取字典值
     * @param type 父类val
     * @param label 子类标签
     * @param defaultVal 默认值
     * @return
     */
    public static String getDictVal(String type, String label,String defaultVal) {
        List<Dict> dictList4Type = getDictList4Type(type);
        if (dictList4Type.isEmpty()) {
            return null;
        }
        //获取数据d
        Dict dict = dictList4Type.stream().filter(d -> ObjectUtil.equal(label, d.getLabel())).findFirst().get();
        return ObjectUtil.isNotNull(dict)?dict.getValue():defaultVal;
    }

    /**
     * 根据父类类型，和字典标签获取字典值
     * @param type 父类val
     * @param label 子类标签
     * @return
     */
    public static String getDictVal(String type, String label) {
        return getDictVal(type, label,null);
    }

    /**
     * 清除缓存
     * @param type
     */
    public static void clearDict4Type(String type) {
        //获取redis
        String redisKey = StrUtil.format(ConfigUtil.redisKey().get(DICT_TYPE), type);
        RedisUtil.del(redisKey);
    }
}
